DATA SEGMENT
DATA ENDS
;
STAC SEGMENT PARA STACK
STAC ENDS
;
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START PROC FAR
     ORG 100H;
     MOV DX,8006H;	
     MOV AL,88H;
     OUT DX,AL;				8255初始化；

 MAIN:
	MOV DX,8004H;			CS置高；SCK置低；
	MOV AL,0F1H;
    OUT DX,AL;
  
	MOV BX,0000H;			初始化BX,AX,CX数据；
	MOV AX,0000H;
    MOV CX,0AH; 

     MOV DX,8004H;			CS置低；SCK置低；
     MOV AL,0F0H;
     OUT DX,AL;

     NOP;					等待一段时间；
     NOP;
     NOP;
     NOP;
     NOP;
     NOP;

 S02:MOV DX,8004H;			CS置低；SCK置高；
     MOV AL,0F2H;
     OUT DX,AL;
 	
     MOV DX,8004H;			读取TC77 1bit数据；
     IN AL,DX;

     PUSH AX;				保护AX;
     MOV DX,8004H;			SCK置低；
     MOV AL,0F0H;
     OUT DX,AL;
     POP AX;

     AND AX,0010H;
     JE S01;				判断读入的1bit数据；
     OR BX,01H;				是1，BX最低位写入1，再左移一位；
 S01:SHL BX,01;				是0，直接左移一位；

     LOOP S02;				左移11次，读TC77共10bit；
	 
	 SHR BX,1;				右移，将多的一位丢弃；
	 
	 MOV DX,8004H;	
     MOV AL,0F1H;			将CS置高，SCK置低；
     OUT DX,AL;
	 
	PUSH BX
	AND BX,0200H;			判断读入的第一位是否为0;
	POP BX
	PUSH BX
	JNZ S00;				为0，数据为正数；
	;
	MOV DX,8002H;			为1，数据为负数；		
	MOV AL,01H
	OUT DX,AL
	MOV DX,8000H;			数码管第一位不显示；
	MOV AL,0FFH
	OUT DX,AL
	CALL DELAY;				延迟；	
	CALL SEGOFF;			消影；
	JMP ZS
S00:	
	MOV DX,8002H;			数据为负数；
	MOV AL,01H
	OUT DX,AL
	MOV DX,8000H;			数码管第一位显示“-”；
	MOV AL,0BFH
	OUT DX,AL
	CALL DELAY;				延迟；
	CALL SEGOFF;			消影；
	;
	POP BX
	DEC BX;					将负数的数据转化为原码（减1，取反）
	XOR BX,03FFH;			
ZS:
	SHR BX,1;				判断数据最后一位是否为0；右移，看进位标志位；
	JNC SHOWZERO;			为0，跳转；
SHOWFIVE:
	MOV DX,8002H;			
	MOV AL,08H
	OUT DX,AL
	MOV DX,8000H;			为1，数码管第四位显示5；
	MOV AL,92H
	OUT DX,AL
	CALL DELAY
	CALL SEGOFF
	
	JMP THIRD
	;
SHOWZERO:
	MOV DX,8002H
	MOV AL,08H
	OUT DX,AL
	MOV DX,8000H;			为0，数码管第四位显示0；
	MOV AL,0C0H
	OUT DX,AL
	CALL DELAY
	CALL SEGOFF
	;
THIRD:
	MOV AX,BX;			
	MOV BL,0AH;				将数据除以0A，分离十位和个位；
	DIV BL;
	;
	PUSH AX
	MOV DX,8002H
	MOV AL,02H
	OUT DX,AL
	POP AX
	PUSH AX
	AND AX,00FFH;			将十位显示在数码管的第二位上；	
	MOV DX,8000H
	CALL DISPALY;			子程序查找对应的数码管显示值；
	OUT DX,AL
	CALL DELAY
	CALL SEGOFF
	
	POP AX 
	PUSH AX
	MOV DX,8002H
	MOV AL,04H
	OUT DX,AL
	POP AX
	MOV AL,AH
	AND AX,00FFH
	MOV DX,8000H;			将个位显示在数码管的第三位上；
	CALL DISPALY;			子程序查找对应的数码管显示值；
	AND AL,7FH
	OUT DX,AL
	CALL DELAY
	CALL SEGOFF
	;
	JMP MAIN;				跳转回主程序；
	;	

	 NSEG DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH
	 DSEG DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H,08H,03H,46H,21H,06H,0EH
 START ENDP;

 DELAY PROC;				延迟程序；
     MOV CX,001AH;
 S99:NOP;
     NOP;
     LOOP S99;
     RET
  DELAY ENDP;
  
  SEGOFF PROC;				数码管消影子程序
	MOV DX,8000H;
	MOV AL,0FFH;
	OUT DX,AL;
	RET;
  SEGOFF ENDP;
  
  DISPALY PROC;				数码管显示值转换子程序
	 CMP AL,00H;
	 JNE NUM1;
	 MOV AL,0C0H;
	 JMP ENNUM;
NUM1:CMP AL,01H;
	 JNE NUM2;
	 MOV AL,0F9H;
	 JMP ENNUM;
NUM2:CMP AL,02H;
	 JNE NUM3;
	 MOV AL,0A4H;
	 JMP ENNUM;
NUM3:CMP AL,03H;
	 JNE NUM4;
	 MOV AL,0B0H;
	 JMP ENNUM;
NUM4:CMP AL,04H;
	 JNE NUM5;
	 MOV AL,99H;
	 JMP ENNUM;
NUM5:CMP AL,05H;
	 JNE NUM6;
	 MOV AL,92H;
	 JMP ENNUM;
NUM6:CMP AL,06H;
	 JNE NUM7;
	 MOV AL,82H;
	 JMP ENNUM;
NUM7:CMP AL,07H;
	 JNE NUM8;
	 MOV AL,0F8H;
	 JMP ENNUM;
NUM8:CMP AL,08H;
	 JNE NUM9;
	 MOV AL,80H;
	 JMP ENNUM;
NUM9:MOV AL,90H;
ENNUM:NOP;
     RET;
DISPALY ENDP
;
 CODE ENDS;
 END START;
